package practica3;

import java.io.BufferedWriter;
import java.io.FileWriter;

import weka.classifiers.Classifier;
import weka.classifiers.Evaluation;
import weka.core.Instances;

/** Clase que estima la clase(del atributo) en un conjunto de test */
public class Predictions {
	
	public Predictions(){}
	
	public void predictClass(Instances test,Classifier estimador, Evaluation evaluator, String path) throws Exception{
		   
		// 1.1 Entrenar el clasificador con 5-fold CV de los datos mediante el algoritmo proporcionado
		evaluator.evaluateModel(estimador, test);
		
		//2. TRANSFORMAR LOS RESULTADOS
		double prediction;
		FileWriter flS = new FileWriter(path);
		BufferedWriter fS = new BufferedWriter(flS);
		
		fS.write("PREDICCIONES\n");
		fS.write("------------\n");
		for (int i = 0; i < test.numInstances(); i++) {
			// calcular la prediccion que hace el modelo (es decir, la clase estimada por el modelo)
			prediction = evaluator.evaluateModelOnceAndRecordPrediction(estimador, test.instance(i));
			fS.write(String.format(" ID:  " + i));
			// escribir la clase real que aparece en el conjunto de test y la clase estimada
			fS.write("  CLASE ESTIMADA: " + test.classAttribute().value((int) prediction));
			fS.write(" CLASE REAL: " + test.classAttribute().value((int) test.instance(i).classValue()));			
			fS.newLine();	
		}
		fS.close();
	}
	
	//sacar txt
	public static void obtenerArchivoCalidad(String path, Evaluation evaluatorMax, String algoritmo, String tipo) throws Exception{
		FileWriter flS = new FileWriter(path);
		BufferedWriter fS = new BufferedWriter(flS);
				
		fS.write("\nCALIDAD " + tipo + " PARA EL ALGORITMO " + algoritmo);
		fS.write("------------------------------------------");
		fS.write(evaluatorMax.toClassDetailsString());
		fS.write(evaluatorMax.toSummaryString());
		fS.write(evaluatorMax.toMatrixString());
		fS.close();
	}
}
